# language: zh-CN
# 需求ID: REQ-005
# SRS需求: 9.1 命令执行引擎
# Feature ID: Epic 9.1
# 用户故事: US-024, US-025, US-026
功能: 命令执行
  作为领域专家
  我希望能在YAML DSL中声明业务命令及其参数
  以便定义业务操作

  背景:
    假设我是一个领域专家
    并且我需要定义业务操作
    并且我希望命令能安全可靠地执行

  # US-024: 作为领域专家，我希望能声明业务命令及其参数
  场景: 声明业务命令及其参数
    假设我定义了用户注册命令:
      """
      # User Domain Model with Commands
      name: User
      version: 1.0.0
      
      entity:
        name: User
        table: users
        
        fields:
          id:
            type: string
            primary: true
            generated: uuid
          
          name:
            type: string
            required: true
          
          email:
            type: string
            unique: true
            required: true
            format: email
          
          status:
            type: enum
            values: ['pending', 'active', 'inactive']
            default: pending
        
        commands:
          - name: RegisterUser
            input:
              name:
                type: string
                required: true
                minLength: 2
              
              email:
                type: string
                required: true
                format: email
              
              password:
                type: string
                required: true
                minLength: 8
            
            output: User
            
            events:
              - UserRegistered
            
            preconditions:
              - email_not_exists
      """
    当系统解析命令定义时
    那么应该识别出RegisterUser命令
    并且应该验证输入参数的类型和约束
    并且应该识别输出类型为User
    并且应该识别会发布UserRegistered事件
    并且应该识别前置条件检查

  场景: 命令在安全沙箱中执行
    假设我执行用户注册命令
    当我调用RegisterUser命令:
      """
      {
        "name": "John Doe",
        "email": "john@example.com",
        "password": "SecurePass123"
      }
      """
    那么命令应该在隔离的执行环境中运行
    并且应该限制命令的系统访问权限
    并且应该防止恶意代码执行
    并且应该监控命令执行时间和资源使用
    并且应该在超时时自动终止命令

  场景: 命令前置条件验证
    假设RegisterUser命令有前置条件
    当我尝试注册已存在邮箱的用户时
    那么系统应该检查email_not_exists前置条件
    并且应该在前置条件失败时阻止命令执行
    并且应该返回前置条件失败的错误信息:
      """
      {
        "error": "PRECONDITION_FAILED",
        "message": "邮箱已存在",
        "code": "EMAIL_ALREADY_EXISTS"
      }
      """

  # US-025: 作为领域专家，我希望命令能在事务中安全执行
  场景: 命令在事务中执行
    假设我定义了复杂的业务命令:
      """
      # Order Domain Model with Complex Command
      name: Order
      version: 1.0.0
      
      commands:
        - name: CreateOrderWithItems
          input:
            userId:
              type: string
              required: true
            
            items:
              type: array
              items:
                type: OrderItemInput
              required: true
              minLength: 1
            
            shippingAddress:
              type: AddressInput
              required: true
          
          output: Order
          
          events:
            - OrderCreated
            - InventoryReserved
          
          transactional: true
      """
    当我执行CreateOrderWithItems命令时
    那么所有数据库操作应该在同一事务中执行
    并且应该在任何步骤失败时回滚所有变更
    并且应该保证数据的一致性
    并且应该在事务提交后发布事件

  场景: 命令执行的幂等性
    假设我定义了幂等命令:
      """
      # User Domain Model with Idempotent Command
      name: User
      version: 1.0.0
      
      commands:
        - name: ActivateUser
          input:
            userId:
              type: string
              required: true
            
            reason:
              type: string
              optional: true
          
          output: User
          
          idempotent: true
          idempotencyKey: userId
      """
    当我多次执行相同的ActivateUser命令时
    那么应该检测重复执行
    并且应该返回相同的结果
    并且应该避免重复的副作用
    并且应该记录幂等性检查日志

  # US-026: 作为系统管理员，我希望命令执行有权限控制
  场景: 命令执行权限控制
    假设命令需要特定权限:
      """
      # User Domain Model with Permission-controlled Command
      name: User
      version: 1.0.0
      
      commands:
        - name: DeleteUser
          input:
            userId:
              type: string
              required: true
          
          output: void
          
          permissions:
            - 'user:delete'
          
          events:
            - UserDeleted
      """
    当用户尝试执行DeleteUser命令时
    那么系统应该验证用户权限
    并且应该在权限不足时拒绝执行
    并且应该记录权限检查日志
    并且应该返回权限不足的错误信息

  场景: 命令执行的审计日志
    假设我执行任何业务命令
    当命令开始执行时
    那么系统应该记录命令执行开始日志
    并且应该记录执行用户、时间、输入参数
    当命令执行完成时
    那么应该记录执行结果和耗时
    当命令执行失败时
    那么应该记录失败原因和错误堆栈

  场景: 异步命令执行
    假设我定义了长时间运行的命令:
      """
      # Report Domain Model with Async Command
      name: Report
      version: 1.0.0
      
      commands:
        - name: GenerateReport
          input:
            reportType:
              type: string
              required: true
            
            dateRange:
              type: DateRange
              required: true
          
          output: Report
          
          async: true
          timeout: 5m
          
          events:
            - ReportGenerationStarted
            - ReportGenerated
      """
    当我执行GenerateReport命令时
    那么命令应该异步执行
    并且应该立即返回执行ID
    并且应该发布ReportGenerationStarted事件
    并且应该在完成时发布ReportGenerated事件
    并且应该提供查询执行状态的接口

  场景: 命令执行的重试机制
    假设命令执行因临时错误失败
    当系统检测到可重试的错误时
    那么应该根据重试策略自动重试
    并且应该使用指数退避算法
    并且应该限制最大重试次数
    并且应该记录每次重试的日志
    并且应该在最终失败时通知相关方

  场景: 命令执行的监控和告警
    假设系统需要监控命令执行情况
    当命令执行时
    那么应该收集执行指标（耗时、成功率、错误率）
    并且应该在执行异常时触发告警
    并且应该提供命令执行的仪表板
    并且应该支持按命令类型、用户、时间等维度分析